package com.xu.mvc.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

/**
 * SpringMVC 获取请求参数的方法
 *
 * 1.通过 ServletAPI 获取
 *
 * 将 HttpServletRequest 作为控制器方法的形参，此时 HttpServletRequest 类型的参数表示封装了当前请求的请求报文的对象
 *
 * 2.通过控制器方法的形参获取请求参数
 *
 * 在控制器方法的形参位置，设置和请求参数同名的形参，当浏览器发送请求，匹配到请求映射时，在 DispatcherServlet 中就会将
 * 请求参数赋值给相应的形参.
 *
 * 若请求所传输的请求参数中有多个同名的请求参数，此时可以在控制器方法的形参中设置字符串数组或者字符串类型的形参接收此请求参数
 * 若使用字符串数组类型的形参，此参数的数组中包含了每一个数据
 * 若使用字符串类型的形参，此参数的值为每个数据中间使用逗号拼接的结果
 *
 * 3.@RequestParam
 *
 * 注解 @RequestParam 是将请求参数和控制器方法的形参创建映射关系
 * 注解 @RequestParam 一共有三个属性：
 *      3.1 value：指定为形参赋值的请求参数的参数名
 *      3.2 required：设置是否必须传输此请求参数，默认值为 true
 *          若设置为true时，则当前请求必须传输value所指定的请求参数，若没有传输该请求参数，且没有设置 defaultValue 属性，
 *          则页面报错 400：Required String parameter 'xxx' is not present；若设置为 false，则当前请求不是必须传输 value
 *          所指定的请求参数，若没有传输，则注解所标识的形参的值为 null
 *      3.3 defaultValue：不管 required 属性值为 true 或 false，当 value 所指定的请求参数没有传输或传输的值为""时，
 *          则使用默认值为形参赋值
 *
 * 4.通过 POJO 获取请求参数
 *
 * 可以在控制器方法的形参位置设置一个实体类类型的形参，此时若浏览器传输的请求参数的参数名和实体类中的属性名一致，
 * 那么请求参数就会为此属性赋值
 */

@Controller
public class HelloController {

    @RequestMapping("/")
    public String index(){
        // 返回视图名称，即加上配置视图解析器时，指定的前缀和后缀
        return "index";
    }

    @RequestMapping("/target")
    public String toTarget(){
        return "target";
    }

}
